{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Table of contents**<a id='toc0_'></a>    \n",
    "- [数据操作](#toc1_)    \n",
    "  - [数据类型](#toc1_1_)    \n",
    "    - [查看数据类型：](#toc1_1_1_)    \n",
    "  - [不同维度的tensor](#toc1_2_)    \n",
    "    - [0维Tensor](#toc1_2_1_)    \n",
    "    - [1维Tensor](#toc1_2_2_)    \n",
    "    - [2维Tensor](#toc1_2_3_)    \n",
    "  - [创建张量](#toc1_3_)    \n",
    "    - [从numpy导入](#toc1_3_1_)    \n",
    "    - [0或1初始化](#toc1_3_2_)    \n",
    "    - [复制形状初始化](#toc1_3_3_)    \n",
    "  - [维度变换](#toc1_4_)    \n",
    "    - [挤压与解压](#toc1_4_1_)    \n",
    "    - [扩展与重复](#toc1_4_2_)    \n",
    "    - [转置交换](#toc1_4_3_)    \n",
    "    - [连接、拆分](#toc1_4_4_)    \n",
    "  - [运算](#toc1_5_)    \n",
    "    - [常见的标准算术运算符](#toc1_5_1_)    \n",
    "    - [其他矩阵乘法](#toc1_5_2_)    \n",
    "  - [广播机制](#toc1_6_)    \n",
    "  - [统计属性](#toc1_7_)    \n",
    "  - [索引和切片](#toc1_8_)    \n",
    "  - [节省内存](#toc1_9_)    \n",
    "  - [转换为其他 Python 对象](#toc1_10_)    \n",
    "  - [小结](#toc1_11_)    \n",
    "  - [练习](#toc1_12_)    \n",
    "\n",
    "<!-- vscode-jupyter-toc-config\n",
    "\tnumbering=false\n",
    "\tanchor=true\n",
    "\tflat=false\n",
    "\tminLevel=1\n",
    "\tmaxLevel=6\n",
    "\t/vscode-jupyter-toc-config -->\n",
    "<!-- THIS CELL WILL BE REPLACED ON TOC UPDATE. DO NOT WRITE YOUR TEXT IN THIS CELL -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <a id='toc1_'></a>[数据操作](#toc0_)\n",
    ":label:`sec_ndarray`\n",
    "\n",
    "为了能够完成各种操作，我们需要某种方法来存储和操作数据。一般来说，我们需要做两件重要的事情：（1）获取数据；（2）在将数据读入计算机后对其进行处理。如果没有某种方法来存储数据，那么获取数据是没有意义的。我们先尝试一下合成数据。首先，我们介绍$n$维数组，也称为*张量*（tensor）。\n",
    "\n",
    "使用过Python中使用最广泛的科学计算包NumPy的读者会对本部分很熟悉。无论使用哪个深度学习框架，它的*张量类*（在MXNet中为`ndarray`，在 PyTorch 和TensorFlow中为`Tensor`）都与Numpy的`ndarray`类似，但又比Numpy的`ndarray`多一些重要功能：首先，GPU 很好地支持加速计算，而NumPy仅支持CPU计算；其次，张量类支持自动微分。这些功能使得张量类更适合深度学习。如果没有特殊说明，本书中所说的张量均指的是张量类的实例。\n",
    "\n",
    "\n",
    "## <a id='toc1_1_'></a>[数据类型](#toc0_)\n",
    "\n",
    "本节的目标是帮助读者了解并运行一些在阅读本书的过程中会用到的基本数值计算工具。如果你很难理解一些数学概念或库函数，请不要担心。后面的章节将通过一些实际的例子来回顾这些内容。如果你已经有了一些背景知识，想要深入学习数学内容，可以跳过本节。\n"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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/9ppANUt9lQ1bpP88Yzj4dfK8WoziVvF58cw3d32PPxaFcLiwxDa1va1jsuEzMhIZG5ow9uIovXQVTqgS/T1xcVDnylY8QyQNywSUsTdyDwyDu807rV189fenD/f50bzbbCv9i0K+j+qkThMjjsqaRyCTkdBNwDw2440pkvGfZUO6OrvoS1fC8EPzsbk41lI0CUgIT4FeW3uXGhlbABU8bPx/kNWZOokSJIWw55ZiWZbYL9tlv82KOahybBmayHFZ8I6IBF4LR8mNKrvG/zcGzw33do2yOd9wHe923cakJ4QCUmKRPqB8Zj9oBqWN4dDGpHffD0A+I0QQrSwjKLa9WfP7azxqx7a8gqH1vy8+aKqdcF1VgVU21GFQAR3b0g0TNMkFA8tw0vxHRif0jZkQlqrx9Zpd+BMl0AEB12iP6duT+4Xx6qCg1r9cO1ClDyvhWHAVw2PFI4YMOpJF2YveQA9Gp1zHelybpPawwW1VfYipD5oxdNXwGtTLnWuSjtc3YJxWTVlHd0GXcT7gGLvubqyHcebz/2ALdcFeo3vuqx1cj9bVwU3OsmtsBxQQz2hY8JqXyoEBV/oWIXLWCcVgoLbv0lzVbugOmtCwZoYJD7VeHsqBHUPbmGwMF123F/WrKsKYB05m4nVRaDq3rjtvgxcKm3QRbgPXPTk6pLrwWmV/0HGS01HpIePvAP/6oBo2pNjQz6K+z+LZf06OhKFqUKgvkR6Sq5sdhSnxSPLHAjdrBXQew6Y7axCSEiHBebX5dkmXWK25eHuiQa4bp6MZR8wtaKO1EwbdBHvAxf9sSARERHRlYz/cTMRERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRURERGRgphcERERESmIyRXRFcTlsMPh6ugoiIh+3S56cmWaJkGS3H/a4Uida4S99mJHQXRlMj8fh5xNHR0F0eXLNE1C5oaOjsKbY2cBMkdr5ftmpBYp04pQ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8Xn7/ems3q76I0RzrkRERCzzNcMwjEsd8HqsJUCg2QYnjtNEDAnD+8soTICyByexd9ZbPHS92Wb/63NI++OdHFo5oXWtnYtS2ZJVxf8ad5ohMQlEmZIlIiIifVzfeC3YUwNt2AYCtoTzmhdx8dVx9Kifo9V1BK6/ElvgOJV//BPp4/6x46pDYkno1d/4EhERkb5Ecx0viiuZ/cxDsH6q+XeubpzFFmcRhd+LTFG24VeS2L9So4iIiLTTv14LioiIiPRxGrkSERERsZDClYiIiIiFFK5ERERELKRwJSIiImIhhSsRERERCylciYiIiFhI4UpERETEQgpXIiIiIhZSuBIRERGxkMKViIiIiIUUrkREREQspHAlIiIiYiGFKxERERELKVyJiIiIWEjhSkRERMRCClciIiIiFlK4EhEREbGQwpWIiIiIhRSuRERERCykcCUiIiJiIYUrEREREQspXImIiIhYSOFKRERExEIKVyIiIiIWUrgSERERsZDClYiIiIiFBp1vAV98ecqKdoiIiIhcFjRyJSIiImIhhSsRERERCylciYiIiFhI4UpERETEQgpXIiIiIhZSuBIRERGxkMKViIiIiIUUrkREREQspHAlIiIiYiGFKxERERELKVyJiIiIWEjhSkRERMRCClciIiIiFhp0qRsgIudu2N9ccamb0O998eWpS90E6SN0PX01XYh7QP8auWoJ0NQYsKy4QFM9TdYVJyIiInKxw1WAJt9Btr+0jPtn3MiKne0WtzSxf9PD5GTl8mZ9lM19r3H/A6/h67BgH2uybmBFZfctqNk4i4zrxpCx4C3+sDKrR9t066MCbhn/FFUWFHUx6205vov6pf8ff713In/NW0yj19LWyeXA56ZmkZvGnqxblU914e7Oy3FlUu3KpKb0mLmuK5NqVw6+jhe0yGWrrjATz0V/WERqLM0JXn/51F3aply2Lmq48v06l5wnfo03YRKZI5toCl/YcoSX77uDBeVJ/Ki4gMnxvSl5DPO2f8BD6QAHef5f5rP1ZJTVWraxzj2GX1bto2LFJIae8560q+ObeezY/TBp51zeOepRvV30x/EmBnz/V/w//7aNv3UN43RhMV9emJbKxdCbIHSxeQ9zNmMVKe5yRk4bAWlLSXFvYqjjPMuNFuhCQa5DX+zGoweK9EJfCEI9VVeYGQxM4ef4MXyLwj83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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**torch中的数据类型：**\n",
    "\n",
    "![image.png](attachment:image.png)\n",
    "\n",
    "https://pytorch.org/docs/stable/tensor_attributes.html\n",
    "\n",
    "\n",
    "没有字符型处理能力，一般使用one-hot编码或embending：\n",
    "Word2vec 和 GloVe 都是用于生成词嵌入（word embeddings）的工具，它们可以将单词映射到高维空间的向量，这些向量能够捕捉单词的语义和上下文信息。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 2,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "(**首先，我们导入 `torch`。请注意，虽然它被称为PyTorch，但我们应该导入 `torch` 而不是 `pytorch`。**)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 5,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 7
   },
   "source": [
    "[**张量表示由一个数值组成的数组，这个数组可能有多个维度**]。具有一个轴的张量对应数学上的*向量*（vector）。具有两个轴的张量对应数学上的 *矩阵*（matrix）。具有两个轴以上的张量没有特殊的数学名称。\n",
    "\n",
    "首先，可以使用`arange`创建一个行向量`x`。这个行向量包含从0开始的前12个整数，它们被默认创建为浮点数。张量中的每个值都称为张量的*元素*（element）。例如，张量`x`中有12个元素。除非额外指定，否则新的张量将存储在内存中，并采用基于CPU的计算。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 9,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "x = torch.arange(12)\n",
    "## help(torch.arange) 查看函数API\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以在这里查看torch支持的数据类型,[torch.doc](https://pytorch.org/docs/stable/tensors.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_1_1_'></a>[查看数据类型：](#toc0_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "type(x) #不推荐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "isinstance(x,torch.LongTensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "isinstance(x,torch.cuda.LongTensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=x.cuda(0)\n",
    "isinstance(x,torch.cuda.LongTensor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 11
   },
   "source": [
    "[**可以通过张量的 `shape` 属性来访问张量的*形状***] (~~和张量中元素的总数~~)（沿每个轴的长度）。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 12,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "x.shape ##形状"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 13
   },
   "source": [
    "如果只想知道张量中元素的总数，即形状的所有元素乘积，可以检查它的大小（size）。\n",
    "因为这里在处理的是一个向量，所以它的 `shape` 与它的 `size` 相同。\n",
    "\n",
    "*number of elements 永远是个标量*\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 15,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "x.numel()##查看元素个数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ndim查看多少维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.ndim  ##查看维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.dim()##查看维度"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_2_'></a>[不同维度的tensor](#toc0_)\n",
    "\n",
    "![image.png](attachment:image.png)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_2_1_'></a>[0维Tensor](#toc0_)\n",
    "**通常0维Tensor用于存储一类标签或损失值`Loss`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=3.1\n",
    "b=torch.tensor(a)\n",
    "# print(a.ndim,b.ndim)  #'float' object has no attribute 'ndim'\n",
    "b.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b.shape #torch.Size([])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# len(b)\n",
    "len(b.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "type(b.shape)   #torch.Size类型，torch.Size是PyTorch中用于表示张量尺寸的特殊类，不是元组类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(b.size(),b)   #b是一个标量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_2_2_'></a>[1维Tensor](#toc0_)\n",
    "**通常用于表示偏置'`bias`'**\n",
    "在神经网络中，每个神经元都包含一个偏置（bias）参数，这是因为在实际应用中，神经网络的输入数据往往不是标准的，它们可能需要通过一个非线性变换来正确处理。偏置参数的作用是为神经元的输入提供一个额外的偏移量，以便神经元可以学习到数据的真实分布。具体来说，偏置的作用包括：非线性处理,防止过拟合(区分重要特征和噪声),增强泛化能力(更好地处理各种复杂的数据分布,推广到未见过的数据)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#看看0维与1维的区别\n",
    "x = torch.randn(1)\n",
    "print(x.size(),x)   #x是个张量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_2_3_'></a>[2维Tensor](#toc0_)\n",
    "\n",
    "一个特征、如2d灰度图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 18,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "# X = x.reshape(3, 4)\n",
    "# X=torch.rand (3,4)    #均匀分布\n",
    "\n",
    "X=torch.randn(3,4)  #正态分布\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 可以使用torch.manual_seed()或torch.cuda.manual_seed()来设置随机数生成器的种子\n",
    "# 设置种子值\n",
    "torch.manual_seed(0)\n",
    "# 生成随机矩阵\n",
    "X_C = torch.randn(3, 4,device='cpu')\n",
    "print(X_C)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 确保GPU可用\n",
    "# device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "# print(device)\n",
    "\n",
    "# 设置种子值\n",
    "torch.cuda.manual_seed(123)\n",
    "# 生成随机矩阵\n",
    "X_G = torch.randn(3, 4,device=\"cuda:0\")\n",
    "print(X_G)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_G[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_G.size(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_G.shape[-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 2维度通常用于存储输入数据，dim 0 存储索引编号，dim 1存储图像数据。如手写数字的28*28图像以batch_size=16输入时(每次输入16张图像一起训练)，dimension=（16，784）\n",
    "- 3维常用RNN中word2vec，如（10,20,516），表示每句话10个单词，20句话一起训练，特征数量516\n",
    "- 4维常用场景如CNN处理图像[b,c,h,w],如（8，3,512,512）（八张图片，RGB三通道，高，宽）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_3_'></a>[创建张量](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_3_1_'></a>[从numpy导入](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 20
   },
   "source": [
    "\n",
    "\n",
    "**预处理通常以numpy新式进行，以兼容许多其他科学计算库和工具（如scikit-learn、Pandas、Matplotlib等），当需要用显卡时转为torch.tensor形式进行运算**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=np.array([[1,2,3],[3,2,1]])\n",
    "b=np.random.rand(2,3)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- from_numpy共享cup与gpu内存，而as_tensor则不是。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.from_numpy(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.as_tensor(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.tensor(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_3_2_'></a>[0或1初始化](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "有时，我们希望[**使用全0、全1、其他常量或者从特定分布中随机采样的数字**]来初始化矩阵。我们可以创建一个形状为 (2, 3, 4) 的张量，其中所有元素都设置为0。代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 22,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "torch.zeros((2, 3, 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 24
   },
   "source": [
    "同样，我们可以创建一个形状为`(2,3,4)`的张量，其中所有元素都设置为1。代码如下：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 26,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "torch.ones((2, 3, 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**初始化0,1以外的值**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.full((2,3,4),7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_3_3_'></a>[复制形状初始化](#toc0_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=torch.as_tensor(a)\n",
    "torch.ones_like(x), torch.zeros_like(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# a = torch.rand_like(x,dtype=torch.float64)\n",
    "a = torch.rand_like(x)\n",
    "a,a.type(),a.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 28
   },
   "source": [
    "有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。例如，当我们构造数组来作为神经网络中的参数时，我们通常会随机初始化参数的值。以下代码创建一个形状为 (3, 4) 的张量。其中的每个元素都从均值为0、标准差为1的标准高斯（正态）分布中随机采样。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 30,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "torch.randn(3, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 32
   },
   "source": [
    "我们还可以[**通过提供包含数值的 Python 列表（或嵌套列表）来为所需张量中的每个元素赋予确定值**]。在这里，最外层的列表对应于轴 0，内层的列表对应于轴 1。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 34,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_4_'></a>[维度变换](#toc0_)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|API|功能描述|\n",
    "|-|--|\n",
    "|view（视图、内存映射）|变换维度。当你确定张量的形状可以改变而不需要复制数据时，使用 view()，因为它更高效|\n",
    "|reshape|变换维度。当你不确定形状是否兼容，或者需要在改变形状时自动处理数据复制的情况，使用 reshape()，因为它更灵活|\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=torch.randn(4,4)\n",
    "y = x.view(16)\n",
    "print(x,'\\n',y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- view与reshap创建视图，不改变原始内存："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = torch.randn(4, 1, 28, 28)\n",
    "a.size()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b=a.transpose(0,2)  #交换维度1，2,由于存在1维，实际上并没有改变数据的顺序\n",
    "b.size()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "c = a.reshape(28, 1, 4, 28)\n",
    "c.size()\n",
    "torch.equal(b, c)   #比较两个张量是否完全相同"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 改变步长:读取步长是读取原始内存的顺序，而非视图,reshape在步长不一致的时候将复制一份数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = torch.arange(9).view(3,3)\n",
    "a,a.stride()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b=a.T\n",
    "b,b.stride()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "view size is not compatible with input tensor's size and stride \n",
    "(at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.\n",
    "'''\n",
    "\n",
    "# b.view(9) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "c=b.reshape(9)\n",
    "c.stride()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 使用-1取代维度："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = torch.rand(2,3)\n",
    "b= a.view(-1,2)\n",
    "c = a.reshape(-1,) \n",
    "b.size(),c.size()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_4_1_'></a>[挤压与解压](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|API|功能|\n",
    "|--|--|\n",
    "|squeeze|压缩大小为1的维度|\n",
    "|unsqueeze|添加一个维度|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=torch.arange(6)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b=a.view(1,6,1,1)\n",
    "c=a.unsqueeze(0).unsqueeze(-1).unsqueeze(-1)\n",
    "torch.equal(b,c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "b.squeeze().size(), b.squeeze(0).squeeze(1).size(), b.squeeze(1).size()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_4_2_'></a>[扩展与重复](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|API|功能|\n",
    "|--|--|\n",
    "|expend|扩展张量不会分配新内存，而只会创建一个 现有 Tensor 上的新视图|\n",
    "|repeat|沿指定维度重复张量,此函数复制张量的数据占用额外内存|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=torch.rand(2,3)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.repeat(2,1),x.repeat(2,1).shape   #第一个维度复制2次，第二维复制1次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.repeat(1,2,1).shape   ,x.repeat(2,1,1).shape ,x.repeat(1,1,1)#写多了的话会添加0维度 ,2代表多出两个空的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x.expand(-1,-1),x.expand(2,3)   #参数为想扩展到多少维度，-1表示改维度保持不变，但只能扩展原始大小为1的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 只能扩展原始大小为1的维度，将一张手写数字图像复制3次，并转换为3通道\n",
    "x=torch.rand(1,1,28,28)\n",
    "x.expand(4,3,-1,-1).shape   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_4_3_'></a>[转置交换](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|API|功能|\n",
    "|--|--|\n",
    "|t()|转置是一个方法支持2D,T是一个属性，支持多维|\n",
    "|transpose|维度交换|\n",
    "|permute|重新排列维度|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[[ 0,  1,  2],\n",
       "          [ 3,  4,  5]],\n",
       " \n",
       "         [[ 6,  7,  8],\n",
       "          [ 9, 10, 11]]]),\n",
       " tensor([[[ 0,  6],\n",
       "          [ 3,  9]],\n",
       " \n",
       "         [[ 1,  7],\n",
       "          [ 4, 10]],\n",
       " \n",
       "         [[ 2,  8],\n",
       "          [ 5, 11]]]),\n",
       " torch.Size([3, 2, 2]))"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#举例说明如何转置多维,对0，1维度进行转置，--0，3，6，9顺序来看。。\n",
    "x=torch.arange(12).reshape(2,2,3)\n",
    "# torch.t(x)  # t() expects a tensor with <= 2 dimensions, but self is 3D\n",
    "x,x.T,x.T.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[0, 1, 2],\n",
       "         [3, 4, 5]]),\n",
       " tensor([[0, 1],\n",
       "         [2, 3],\n",
       "         [4, 5]]),\n",
       " <function Tensor.t>,\n",
       " tensor([[0, 3],\n",
       "         [1, 4],\n",
       "         [2, 5]]),\n",
       " tensor([[0, 3],\n",
       "         [1, 4],\n",
       "         [2, 5]]))"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=torch.arange(6).reshape(2,3)  #可以看到reshape破坏了维度信息\n",
    "x,x.reshape(3,2),x.t,x.transpose(0,1),x.permute(1,0)    #permute 直接告诉顺序即可"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([3, 2, 1, 4]), torch.Size([2, 1, 4, 3]))"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=torch.rand(1,2,3,4)\n",
    "# x.t()\n",
    "x.transpose(0,2).shape,x.permute(1,0,3,2).shape\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_4_4_'></a>[连接、拆分](#toc0_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|API |功能|\n",
    "|--|--|\n",
    "|cat|‘concatenate’的缩写连接，别名concat、concatnate。张量的大小必须匹配,除了被连接那一个维度|\n",
    "|stack|堆叠，所有维度必须一致，会创建一个新的维度|\n",
    "|split|拆分成块‘chunk’，参数是每个块的大小|\n",
    "|chunk|拆分，参数是一个分成多少分|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "x=torch.rand(2,3,4)\n",
    "y=torch.rand(3,3,4)\n",
    "#第一个参数可以是元组也可以是列表\n",
    "torch.cat((x,y),dim=0).shape  \n",
    "torch.cat([x,y],dim=0).shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "    torch.cat([x,y],dim=1).shape     #Sizes of tensors must match except in dimension 1.张量的大小必须匹配，维度1除外\n",
    "except Exception as err:\n",
    "    print(err)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# torch.stack((x,y),0).shape  #stack expects each tensor to be equal size\n",
    "\n",
    "x=torch.rand(2,3)\n",
    "y=torch.rand(2,3)\n",
    "torch.stack((x,y),0).shape\n",
    "#如果两张表格，使用stack，可以增加一个维度，将两张表格合并成一个三维张量，保留分组信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = torch.arange(10).reshape(5,2)\n",
    "a.split(2)  #将a按行分割成2个元素的子张量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a.split(1,dim=1)    #将a按列分割成1个元素的子张量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a,a.chunk(3,dim=0)  #将a按行分割成3个张量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a.chunk(3,1)    #在1维，将a按列分割成3个张量，不够分。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_5_'></a>[矩阵运算](#toc0_)\n",
    "### <a id='toc1_5_1_'></a>[常见的标准算术运算符](#toc0_)\n",
    "\n",
    "这本书不是关于软件工程的。我们的兴趣不仅仅限于从数组读取和写入数据。我们想在这些数组上执行数学运算。一些最简单且最有用的操作是 *按元素*（elementwise） 操作。它们将标准标量运算符应用于数组的每个元素。对于将两个数组作为输入的函数，按元素运算将二元运算符应用于两个数组中的每对位置对应的元素。我们可以基于任何从标量到标量的函数来创建按元素函数。\n",
    "\n",
    "在数学表示法中，我们将通过符号 $f: \\mathbb{R} \\rightarrow \\mathbb{R}$ 来表示 *一元* 标量运算符（只接收一个输入）。这意味着该函数从任何实数（$\\mathbb{R}$）映射到另一个实数。同样，我们通过符号 $f: \\mathbb{R}, \\mathbb{R} \\rightarrow \\mathbb{R}$ 表示 *二元* 标量运算符，这意味着该函数接收两个输入，并产生一个输出。给定同一形状的任意两个向量$\\mathbf{u}$和$\\mathbf{v}$ 和二元运算符 $f$，我们可以得到向量$\\mathbf{c} = F(\\mathbf{u},\\mathbf{v})$。具体计算方法是$c_i \\gets f(u_i, v_i)$ ，其中 $c_i$、$u_i$ 和 $v_i$ 分别是向量$\\mathbf{c}$、$\\mathbf{u}$ 和 $\\mathbf{v}$中的元素。在这里，我们通过将标量函数升级为按元素向量运算来生成向量值 $F: \\mathbb{R}^d, \\mathbb{R}^d \\rightarrow \\mathbb{R}^d$。\n",
    "\n",
    "对于任意具有相同形状的张量，[**常见的标准算术运算符（`+`、`-`、`*`、`/` 和 `**`）都可以被升级为按元素运算**]。我们可以在同一形状的任意两个张量上调用按元素操作。在下面的例子中，我们使用逗号来表示一个具有5个元素的元组，其中每个元素都是按元素操作的结果。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 38,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "x = torch.tensor([1.0, 2, 4, 8])\n",
    "y = torch.tensor([2, 2, 2, 2])\n",
    "x + y, x - y, x * y, x / y, x**y,x.sqrt() # *元素级的乘法,**运算符是求幂运算,sqrt()开平方\n",
    "#也可以使用add、sub、mul、div、,pow()求幂\n",
    "x.add(y),x+y\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 40
   },
   "source": [
    "可以(**按按元素方式应用更多的计算**)，包括像求幂这样的一元运算符。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 42,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "# import numpy as np\n",
    "# np.set_printoptions(suppress=True,   precision=20,  threshold=10,  linewidth=40)    #设置不用科学计数法显示，保留20位小数，打印阈值为10，每行打印40个字符\n",
    "#设置pytorch不用科学计数法显示\n",
    "torch.set_printoptions(precision=2,sci_mode=False) #设置保留2位小数，不使用科学计数法显示\n",
    "torch.exp(x),x.pow(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <a id='toc1_5_2_'></a>[其他矩阵乘法](#toc0_)\n",
    "|*|元素级的乘法|\n",
    "|--|--|\n",
    "|dot|点积两个向量必须是1D,结果为标量 （$\\mathbf{x}^\\top \\mathbf{y} = \\sum_{i=1}^{d} x_i y_i$）|\n",
    "|mm|矩阵乘法（$\\sum A_{i j} B_{j k}$）只适用于2d,$A$的$i$行与$B$的$k$列对位相乘后求和，放到结果的$ik$位置|\n",
    "|matmul或者@|矩阵乘法,常用于线性层来作维度变换，高维度运算时只计算后面两个维度|\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w=torch.arange(6).reshape(6)\n",
    "w,w.dot(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=torch.arange(6).reshape(2,3)\n",
    "y=torch.arange(6).reshape(3,2)\n",
    "z=torch.arange(6).reshape(2,3)\n",
    "\n",
    "x,y,x*z,x@y,x.matmul(y),x.mm(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 高维度运算时只计算后面两个维度\n",
    "a=torch.rand(1,2,3,4)   \n",
    "b=torch.rand(1,1,4,5)   #1维度用到了广播机制\n",
    "(a@b).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_6_'></a>[广播机制](#toc0_)\n",
    ":label:`subsec_broadcasting`\n",
    "\n",
    "在上面的部分中，我们看到了如何在相同形状的两个张量上执行按元素操作。在某些情况下，[**即使形状不同，我们仍然可以通过调用 *广播机制* （broadcasting mechanism） 来执行按元素操作**]。这种机制的工作方式如下：首先，通过适当复制元素来扩展一个或两个数组，以便在转换之后，两个张量具有相同的形状。其次，对生成的数组执行按元素操作。\n",
    "\n",
    "在大多数情况下，我们将沿着数组中长度为1的轴进行广播，如下例子：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 55,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "a = torch.arange(3).reshape((3, 1))\n",
    "b = torch.arange(2).reshape((1, 2))\n",
    "a, b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 57
   },
   "source": [
    "由于 `a` 和 `b` 分别是 $3\\times1$ 和 $1\\times2$ 矩阵，如果我们让它们相加，它们的形状不匹配。我们将两个矩阵*广播*为一个更大的 $3\\times2$ 矩阵，如下所示：矩阵 `a`将复制列，矩阵 `b`将复制行，然后再按元素相加。\n",
    "$$\n",
    "\\left[\\begin{array}{ll}\n",
    "0 & 0 \\\\\n",
    "1 & 1 \\\\\n",
    "2 & 2\n",
    "\\end{array}\\right]+\\left[\\begin{array}{ll}\n",
    "0 & 1 \\\\\n",
    "0 & 1 \\\\\n",
    "0 & 1\n",
    "\\end{array}\\right]\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 58,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "a + b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "只能扩展大小为1或者为空的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#维度不存在也可以广播\n",
    "a = torch.arange(3).reshape((3, 1, 1))\n",
    "b = torch.arange(2).reshape((1, 2))\n",
    "a,b,a+b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#b的0维度不为1，无法广播为3\n",
    "# a = torch.arange(3).reshape((3, 1))\n",
    "# b = torch.arange(2).reshape((2, 2))\n",
    "# a,b,a+b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_7_'></a>[统计属性](#toc0_)\n",
    "|API|功能|描述|\n",
    "|--|--|--|\n",
    "|norm|范数|是泛函分析中的知识，需要掌握L1范数、L2范数、F-范数（弗罗贝尼乌斯范数（Frobenius norm））,2.0以后用Use torch.linalg.vector_norm() when computing vector norms and torch.linalg.matrix_norm()|\n",
    "|mean|均值|\n",
    "|sum|和|\n",
    "|prod|累乘|\n",
    "|max/argmax|最大值/最大值位置|\n",
    "|min/argmin|最小值/最小值位置|\n",
    "|topk|最大或最小值其位置索引|\n",
    "|kthvalue|最小值位置索引|"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "**$L_1$ 范数，它表示为向量元素的绝对值之和：**\n",
    "\n",
    "**$$\\|\\mathbf{x}\\|_1 = \\sum_{i=1}^n \\left|x_i \\right|$$**\n",
    "\n",
    "与 $L_2$ 范数相比，$L_1$ 范数受异常值的影响较小。\n",
    "\n",
    "欧几里得距离是 $L_2$ 范数 **$L_2$ *范数* 是向量元素平方和的平方根：**\n",
    "\n",
    "**$$\\|\\mathbf{x}\\|_2 = \\sqrt{\\sum_{i=1}^n x_i^2},$$**\n",
    "\n",
    "其中，在 $L_2$ 范数中常常省略下标 $2$，也就是说，$\\|\\mathbf{x}\\|$ 等同于 $\\|\\mathbf{x}\\|_2$。在代码中，我们可以按如下方式计算向量的 $L_2$ 范数。\n",
    "\n",
    "**的 *弗罗贝尼乌斯范数*（Frobenius norm） 是矩阵元素平方和的平方根：**\n",
    "**$$\\|\\mathbf{X}\\|_F = \\sqrt{\\sum_{i=1}^m \\sum_{j=1}^n x_{ij}^2}.$$**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(5.)"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = torch.tensor([3.0, -4.0])   #sqrt(3^2+4^2=25)\n",
    "torch.norm(a)   #要求是浮点数,默认是F范数,p='fro'\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[[0., 1., 2.],\n",
       "          [3., 4., 5.]]]),\n",
       " tensor(7.42))"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = torch.arange(6.).reshape(1,2,3) # 支持矩阵计算，\n",
    "a,torch.norm(a)   #sqrt(0^2+1^2+2^2+3^2+4^2+5^2)  默认是F范数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[[1., 1., 1., 1.],\n",
       "          [1., 1., 1., 1.],\n",
       "          [1., 1., 1., 1.]],\n",
       " \n",
       "         [[1., 1., 1., 1.],\n",
       "          [1., 1., 1., 1.],\n",
       "          [1., 1., 1., 1.]]]),\n",
       " tensor(4.90))"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = torch.ones(2,3,4) # 支持矩阵计算，\n",
    "a,torch.norm(a,p='fro')   #sqrt(24)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.norm(a,dim=0) #只对一个维度求范数，sqart(1^2+1^2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.norm(a,p=1,dim=2) #对2维求1范数，对行求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.norm(a,p=2,dim=2) #对2维求2范数，对行求平方和开根号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0.61, 0.58, 0.23],\n",
      "        [0.67, 0.03, 0.66]])\n",
      "最大值0.6667957305908203、最大值位置3、最小值0.03222668170928955、最小值位置4\n",
      "均值0.4618612825870514、和2.771167755126953、累乘0.0011240908643230796\n"
     ]
    }
   ],
   "source": [
    "x=torch.rand(2,3)\n",
    "print(x)\n",
    "#打印最大值、最大值位置、最小值、最小值位置\n",
    "print(\"最大值{}、最大值位置{}、最小值{}、最小值位置{}\".format(x.max(),x.argmax(),x.min(),x.argmin()))\n",
    "# 打印均值、和、累乘、topk\n",
    "print(\"均值{}、和{}、累乘{}\".format(x.mean(),x.sum(),x.prod()))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.return_types.kthvalue(\n",
      "values=tensor([0.67, 0.58, 0.66]),\n",
      "indices=tensor([1, 0, 1]))\n"
     ]
    }
   ],
   "source": [
    "#按行，打印最小值，索引\n",
    "print(x.kthvalue(2,dim=0))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0.61, 0.58, 0.23],\n",
      "        [0.67, 0.03, 0.66]]) torch.return_types.topk(\n",
      "values=tensor([[0.23, 0.58],\n",
      "        [0.03, 0.66]]),\n",
      "indices=tensor([[2, 1],\n",
      "        [1, 2]]))\n",
      "tensor([[0.61, 0.58, 0.23],\n",
      "        [0.67, 0.03, 0.66]]) torch.return_types.topk(\n",
      "values=tensor([[0.67, 0.58, 0.66]]),\n",
      "indices=tensor([[1, 0, 1]]))\n"
     ]
    }
   ],
   "source": [
    "#打印top-2，返回最小的两个值和位置,(取几个数，哪个维度，最大还是最小)，返回其索引\n",
    "print(x,x.topk(2,dim=1,largest=False))    \n",
    "#打印top-2，返回最大的两个值和位置\n",
    "print(x,x.topk(1,dim=0,largest=True))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_8_'></a>[索引和切片](#toc0_)\n",
    "\n",
    "就像在任何其他 Python 数组中一样，张量中的元素可以通过索引访问。与任何 Python 数组一样：第一个元素的索引是 0；可以指定范围以包含第一个元素和最后一个之前的元素。与标准 Python 列表一样，我们可以通过使用负索引根据元素到列表尾部的相对位置访问元素。\n",
    "\n",
    "因此，我们[**可以用 `[-1]` 选择最后一个元素，可以用 `[1:3]` 选择第二个和第三个元素**]，如下所示：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 60,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "X[-1], X[1:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 61,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "[**除读取外，我们还可以通过指定索引来将元素写入矩阵。**]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 63,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "X[1, 2] = 9\n",
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 65
   },
   "source": [
    "如果我们想[**为多个元素赋值相同的值，我们只需要索引所有元素，然后为它们赋值。**]\n",
    "例如，`[0:2, :]` 访问第1行和第2行，其中 “:” 代表沿轴 1（列）的所有元素。虽然我们讨论的是矩阵的索引，但这也适用于向量和超过2个维度的张量。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 66,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "X[0:2, :] = 12\n",
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_9_'></a>[节省内存](#toc0_)\n",
    "\n",
    "[**运行一些操作可能会导致为新结果分配内存**]。例如，如果我们用 `Y = X + Y`，我们将取消引用 `Y` 指向的张量，而是指向新分配的内存处的张量。\n",
    "\n",
    "在下面的例子中，我们用 Python 的 `id()` 函数演示了这一点，它给我们提供了内存中引用对象的确切地址。运行 `Y = Y + X` 后，我们会发现 `id(Y)` 指向另一个位置。这是因为 Python 首先计算 `Y + X`，为结果分配新的内存，然后使 `Y` 指向内存中的这个新位置。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 69,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "Y=1.\n",
    "before = id(Y)\n",
    "Y = Y + X\n",
    "id(Y) == before"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 70
   },
   "source": [
    "这可能是不可取的，原因有两个：首先，我们不想总是不必要地分配内存。在机器学习中，我们可能有数百兆的参数，并且在一秒内多次更新所有参数。通常情况下，我们希望原地执行这些更新。其次，我们可能通过多个变量指向相同参数。如果我们不原地更新，其他引用仍然会指向旧的内存位置，这样我们的某些代码可能会无意中引用旧的参数。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 71,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "幸运的是，(**执行原地操作**)非常简单。我们可以使用切片表示法将操作的结果分配给先前分配的数组，例如 `Y[:] = <expression>`。为了说明这一点，我们首先创建一个新的矩阵 `Z`，其形状与另一个 `Y` 相同，使用 `zeros_like` 来分配一个全$0$的块。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 74,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "Z = torch.zeros_like(Y)\n",
    "print('id(Z):', id(Z))\n",
    "Z[:] = X + Y\n",
    "print('id(Z):', id(Z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 76,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "[**如果在后续计算中没有重复使用 `X`，我们也可以使用 `X[:] = X + Y` 或 `X += Y` 来减少操作的内存开销。**]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 78,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "before = id(X)\n",
    "X += Y\n",
    "id(X) == before"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_10_'></a>[转换为其他 Python 对象](#toc0_)\n",
    "\n",
    "[**转换为 NumPy 张量**]很容易，反之也很容易。转换后的结果不共享内存。\n",
    "这个小的不便实际上是非常重要的：当你在 CPU 或 GPU 上执行操作的时候，如果 Python 的 NumPy 包也希望使用相同的内存块执行其他操作，你不希望停下计算来等它。（cpu开始画图，而GPU继续计算）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 82,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "A = X.numpy()\n",
    "B = torch.tensor(A)\n",
    "type(A), type(B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 84
   },
   "source": [
    "要(**将大小为1的张量转换为 Python 标量**)，我们可以调用 `item` 函数或 Python 的内置函数。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 86,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "a = torch.tensor([3.5])\n",
    "a, a.item(), float(a), int(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <a id='toc1_11_'></a>[小结](#toc0_)\n",
    "\n",
    "* dim\\size\\shape\\tensor\\分别表示什么\n",
    "\n",
    "* 深度学习存储和操作数据的主要接口是张量（$n$维数组）。它提供了各种功能，包括基本数学运算、广播、索引、切片、内存节省和转换其他 Python 对象。\n",
    "\n",
    "## <a id='toc1_12_'></a>[练习](#toc0_)\n",
    "\n",
    "1. 运行本节中的代码。将本节中的条件语句 `X == Y` 更改为 `X < Y` 或 `X > Y`，然后看看你可以得到什么样的张量。\n",
    "1. 用其他形状（例如三维张量）替换广播机制中按元素操作的两个张量。结果是否与预期相同？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 90,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "[Discussions](https://discuss.d2l.ai/t/1747)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dl2024",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
